package com.itheima.d2_collection_traverse;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 1、集合中存储的是元素的什么信息?
 * 集合中存储的是元素对象的地址。
 *
    目标：Collection集合的遍历方式一：使迭代器Iterator遍历
 迭代器是用来遍历集合的专用方式(数组没有迭代器)，在Java中迭代器的代表是Iterator。

 Collection集合获取迭代器的方法
 Iterator<E> iterator() 返回集合中的迭代器对象，该迭代器对象默认指向当前集合的第一个元素

 Iterator迭代器中的常用方法
 boolean hasNext()      询问当前位置是否有元素存在，存在返回true ,不存在返回false
 E next()       获取当前位置的元素，并同时将迭代器对象指向下一个元素处。
 */

/**
 * 1、如何获取集合的迭代器? 迭代器遍历集合的代码具体怎么写？
 * Iterator<E> iterator()：得到迭代器对象，默认指向当前集合的索引0
 *
 * 2、通过迭代器获取集合的元素，如果取元素越界会出现什么异常?
 * 会出现NoSuchElementException异常。
 *
 * 为什么不支持普通的for循环来遍历：
 * 只有支持索引才能支持for循环的遍历，但是collection单列集合接口只有list系列集合才有索引
 */
public class CollectionDemo01 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("赵敏");
        c.add("小昭");
        c.add("素素");
         c.add("灭绝");
        System.out.println(c);
        // c = [赵敏, 小昭, 素素]
        //                       it     该迭代器对象初始默认指向当前集合的第一个元素

        System.out.println("-------迭代器取出来--------");
        // 使用迭代器遍历集合
        // 1、从集合对象中获取迭代器对象。
        Iterator<String> it = c.iterator();
/*      这里用迭代器对象取出来一个元素，集合里面就会少一个元素
        System.out.println(it.next());
        System.out.println(it.next());
        System.out.println(it.next());*/
        // 出现异常的 : NoSuchElementException
        System.out.println(it.next());
        // System.out.println(it.next());

        System.out.println("---------");
        // 2、我们应该使用循环结合迭代器遍历集合。
        while (it.hasNext()){
            String ele = it.next();
            System.out.println(ele);
        }

        System.out.println("--------自己写一遍--------");
        Collection<String> a1 = new ArrayList<>();
        Iterator<String> it1 = a1.iterator();
        a1.add("曾季洪");
        a1.add("牛逼");
        a1.add("Java牛逼");
        System.out.println("先从集合中获取迭代器对象，然后再往集合中放元素，看迭代器对象能不能取到东西： "+a1);
        //System.out.println(it1.next()); //报错： ConcurrentModificationException
        //所以迭代器对象只能取到集合那一刻的值，后续集合有更改，迭代器不参与实时更改
        System.out.println("------重新搞个迭代器对象，然后再遍历--------------");
        Iterator<String> it2 = a1.iterator();
        while (it2.hasNext()){
            //取到元素之后，没有交给一个string类型的变量直接输出，这样是不行的
            System.out.println(it2.next());

            //假设输出两次，那就会出错，刚开始迭代器指向曾季洪并输出，
            // 但是下一行的next方法调用，并没有经过hasnext判断，会容易出错：NoSuchElementException
            // 例如在奇数个元素的，例如迭代器指向第三个，但是第四个没有经过hasnext判断就直接next输出，就会指向一个不存在然后报错
            //System.out.println(it2.next());
        }

    }
}











